/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.DAO;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.sql.ResultSet;
import javax.swing.JOptionPane;

import br.Modelo.Cidade;
import java.util.ArrayList;


public class CidadeDAO {
     
     public static void Salvar(Cidade cidade)
     {
         Connection conexao = FabricaConexao.GeraConexao();
         
         PreparedStatement insereSt = null;
         
         String sql = ("insert into cidade(CODIGO_CID, NOME_CID, ESTADO_CID, CEP_CID) "
                 + "values(?,?,?,?)");
         
         try
         {
             insereSt = conexao.prepareStatement(sql);
            // insereSt.setInt(1, PegaProximoCodigo());
             insereSt.setString(2, cidade.getNomeCidade());
             insereSt.setString(3, cidade.getEstado());
             insereSt.setDouble(4, cidade.getCEP());
             
             insereSt.executeUpdate();
         }
         catch(SQLException e)
         {
             JOptionPane.showMessageDialog(null, "Erro ao incluir Cidade: " + e.getMessage());
         }
         finally
         {
             try
             {
                 insereSt.close();
                 conexao.close();
             }
             catch(Throwable e)
             {
                 JOptionPane.showMessageDialog(null, "Erro ao fechar conexão" + e.getMessage());
             }
         }
     }
     
     public static void Alterar(Cidade cidade)
     {
         Connection conexao = FabricaConexao.GeraConexao();
         
         PreparedStatement insereSt = null;
         
         String sql = ("UPDATE Cidade SET CODIGO_CID = ?, NOME_CID = ?, ESTADO_CID = ?, CEP_CID = ? WHERE CODIGO_CID = ?");
         
         try
         {
             insereSt = conexao.prepareStatement(sql);
             //insereSt.setInt(1, PegaProximoCodigo());
             insereSt.setDouble(1, cidade.getCodigoCidade());
             insereSt.setString(2, cidade.getNomeCidade());
             insereSt.setString(3, cidade.getEstado());
             insereSt.setDouble(4, cidade.getCEP());
             insereSt.setDouble(5, cidade.getCodigoCidade());
             insereSt.executeUpdate();
         }
         catch(SQLException e)
         {
             System.out.println("Erro ao alterar cidade: " + e.getMessage());
         }
         finally
         {
             try
             {
                 insereSt.close();
                 conexao.close();
             }
             catch(Throwable e)
             {
                 System.out.println("Erro ao fechar conexão: " + e.getMessage());
             }
         }
     }
     
     public static void Excluir(Cidade cidade)
     {
         Connection conexao = FabricaConexao.GeraConexao();
         
         PreparedStatement insereSt = null;
         
         String sql = ("DELETE FROM cidade WHERE CODIGO_CID = ?");
         
         try
         {
             insereSt = conexao.prepareStatement(sql);
             insereSt.setDouble(1, cidade.getCodigoCidade());
             insereSt.executeUpdate();
         }
         catch(SQLException e)
         {
             System.out.println("Erro ao excluir cidade: " + e.getMessage());
         }
         finally
         {
             try
             {
                 insereSt.close();
                 conexao.close();
             }
             catch(Throwable e)
             {
                 JOptionPane.showMessageDialog(null, "Erro ao fechar a conexão" + e.getMessage());
             }
         }
     }
     
    
     
     public static Cidade RecuperaObjetoNome(String Nome)
     {
         Connection conexao = FabricaConexao.GeraConexao();
         
         Cidade cidadeRecuperado = new Cidade();
         PreparedStatement consulta = null;
         ResultSet resultado = null;
         
         String sql = "SELECT * FROM Cidade WHERE nome_cid = ?";
         
         try
         {
             consulta = conexao.prepareStatement(sql);
             consulta.setString(1, Nome);
             resultado = consulta.executeQuery();
             
             resultado.next();
             
             cidadeRecuperado.setCodigoCidade(resultado.getDouble("codigo_cid"));
             cidadeRecuperado.setNomeCidade(resultado.getString("nome_cid"));
             cidadeRecuperado.setEstado(resultado.getString("estado_cid"));
             cidadeRecuperado.setCEP(resultado.getDouble("cep_cid"));             
             
         }
         catch(SQLException e)
         {
             System.out.println("Erro ao recuperar cidade" + e.getMessage());
         }
         finally
         {
             try
             {
                 consulta.close();
                 resultado.close();
                 conexao.close();
             }
             catch(Throwable e)
             {
                 System.out.println("Erro ao fechar conexão com o BD" + e.getMessage());
             }
             finally
             {
                 return cidadeRecuperado;
             }
         }
     }
     
      
      public static ArrayList<Cidade> RecuperaObjetos()
      {
          int i = 0;
         Connection conexao = FabricaConexao.GeraConexao();
         ArrayList<Cidade> vetCidade = new ArrayList<Cidade>(); 
         
         PreparedStatement consulta = null;
         ResultSet resultado = null;
         
         String sql = "SELECT * FROM Cidade;";
         
         try
         {
             consulta = conexao.prepareStatement(sql);
             resultado = consulta.executeQuery();
             
             while(resultado.next()){
                 Cidade cidadeRecuperado = new Cidade();
                 cidadeRecuperado.setCodigoCidade(resultado.getDouble("codigo_cid"));
                 cidadeRecuperado.setNomeCidade(resultado.getString("nome_cid"));
                 cidadeRecuperado.setEstado(resultado.getString("estado_cid"));
                 cidadeRecuperado.setCEP(resultado.getDouble("cep_cid"));     
                 vetCidade.add(cidadeRecuperado);
             }
             
         }
         
         catch(SQLException e)
         {
             System.out.println("Erro ao recuperar cidade" + e.getMessage());
         }
         finally
         {
             try
             {
                 consulta.close();
                 resultado.close();
                 conexao.close();
             }
             catch(Throwable e)
             {
                 System.out.println("Erro ao fechar conexão com o BD" + e.getMessage());
             }
            
                 
            
         }
         return vetCidade;
      }
      
      private static final int cnstNavPri = 0;
      private static final int cnstNavAnt = 1;
      private static final  int cnstNavProx = 2;
      private static final int cnstNavUlt = 3;
      
      public static String SQLNavegacao(int pOpcao, int pCodigoAtual)
      {
          String SQL = "";
          switch(pOpcao)
          {
              case cnstNavPri:
                  SQL = "SELECT MIN(codigo_cid) AS cod FROM cidade";
                  break;
              case cnstNavAnt:
                  SQL = "SELECT MAX(codigo_cid) AS cod FROM cidade WHERE codigo_cid< " + String.valueOf(pCodigoAtual);
                  break;
              case cnstNavProx:
                  SQL = "SELECT MIN(codigo_cid) AS cod FROM cidade WHERE codigo_cid > " + String.valueOf(pCodigoAtual);
                  break;
              case cnstNavUlt:
                  SQL = "SELECT MAX(codigo_cid) AS cod FROM cidade";
                  break;
          }
          return SQL;
      }
      
      public static int PegaCodigoPelaNavegacao(int pOpcao, int pCodigoAtual)
      {
          Connection conexao = FabricaConexao.GeraConexao();
          Statement consulta = null;
          ResultSet resultado = null;
          int CodigoEncontrado = -1;
          
          try{
              consulta = (Statement)conexao.createStatement();
              resultado = consulta.executeQuery(SQLNavegacao(pOpcao, pCodigoAtual));
              
              resultado.next();
              CodigoEncontrado = resultado.getInt("cod");
          }
          catch(Exception e){
              JOptionPane.showMessageDialog(null, "Erro ao executar sql de navegação: " + e.getMessage());
          }
          finally{
              try{
                  consulta.close();
                  conexao.close();
              }
              catch(Throwable e){
                  JOptionPane.showMessageDialog(null, "Erro ao fechar conexão com o BD: " + e.getMessage());
              }
          }
          
          return CodigoEncontrado;
      }
      
      public static ArrayList<Cidade> PesquisaObjeto(String sCampo, String sValor, boolean bTodaParte){
          String sql = "SELECT * FROM Cidade WHERE " +  sCampo;
          if(bTodaParte){
              sql = sql + " like '%";
            sql = sql + sValor + "%'";
          }
          else
          {
              sql = sql + " = '" + sValor + "'";
          }
          System.out.println(sql);
          
          return RecuperaObjetos(sql);
      }
      
      private static ArrayList<Cidade> RecuperaObjetos(String sql){
          Connection conexao = FabricaConexao.GeraConexao();
          Cidade cid;
          
          ArrayList<Cidade> cidade = new ArrayList<Cidade>();
          Statement consulta = null;
          ResultSet resultado = null;
          
          try
          {
              consulta = (Statement)conexao.createStatement();
              resultado = consulta.executeQuery(sql);
              
              while(resultado.next())
              {
                  Cidade cidadeTemp = new Cidade();
                  cidadeTemp.setCodigoCidade(resultado.getDouble("codigo_cid"));
                  cidadeTemp.setNomeCidade(resultado.getString("nome_cid"));
                  cidadeTemp.setCEP(resultado.getDouble("CEP_CID"));
                  cidadeTemp.setEstado(resultado.getString("estado_cid"));
                 
                  
                  cidade.add(cidadeTemp);
              }
          }
          catch(SQLException e)
          {
              System.out.println("Erro ao recuperar usuarios: " + e.getMessage());
          }
          finally
          {
              try
              {
                  consulta.close();
                  resultado.close();
                  conexao.close();
              }
              catch(Throwable e)
              {
                  System.out.println("Erro ao fechar a conexão: " + e.getMessage());
              }
              finally
              {
                  return cidade;
              }
          }
      }
}
